// src/services/api.ts
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { LoginRequest, LoginResponseData, ApiResponse } from '@/types';

// 获取环境变量中的API基础URL
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';

// 创建axios实例
const apiClient: AxiosInstance = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
  },
  timeout: 10000, // 10秒超时
});

// 请求拦截器
apiClient.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    // 例如：添加认证token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
apiClient.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    // 返回响应数据本身，这样调用方可以直接访问数据
    return response.data;
  },
  (error: AxiosError) => {
    // 对响应错误做点什么
    if (error.response) {
      // 请求已发出，但服务器响应的状态码不在2xx范围内
      console.error('API Error:', error.response.status, error.response.data);
      switch (error.response.status) {
        case 401:
          // 未授权，清除本地存储的认证信息并重定向到登录页
          localStorage.removeItem('token');
          localStorage.removeItem('userInfo');
          // 只在浏览器环境中执行重定向
          if (typeof window !== 'undefined') {
            window.location.href = '/login';
          }
          break;
        case 403:
          // 禁止访问
          console.error('Access forbidden');
          break;
        case 500:
          // 服务器内部错误
          console.error('Server error');
          break;
        default:
          console.error('Unknown error');
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error('Network error:', error.request);
    } else {
      // 在设置请求时发生了一些事情，触发了错误
      console.error('Error:', error.message);
    }
    return Promise.reject(error);
  }
);

// 通用请求方法
const request = async <T = any>(config: AxiosRequestConfig): Promise<T> => {
  try {
    const response: AxiosResponse<T> = await apiClient(config);
    return response.data;
  } catch (error) {
    throw error;
  }
};

// GET请求
const get = async <T = any>(url: string, config?: AxiosRequestConfig): Promise<T> => {
  return request<T>({ ...config, method: 'GET', url });
};

// POST请求
const post = async <T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> => {
  return request<T>({ ...config, method: 'POST', url, data });
};

// PUT请求
const put = async <T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> => {
  return request<T>({ ...config, method: 'PUT', url, data });
};

// DELETE请求
const del = async <T = any>(url: string, config?: AxiosRequestConfig): Promise<T> => {
  return request<T>({ ...config, method: 'DELETE', url });
};

// 登录接口
export const login = async (loginData: LoginRequest): Promise<ApiResponse<LoginResponseData>> => {
  // 确保必需字段有默认值
  const data: LoginRequest = {
    clientId: "",
    grantType: "",
    userType: "",
    ...loginData
  };
  
  return post<ApiResponse<LoginResponseData>>('/admin/web/driver/auth/login', data);
};

// 登出接口
export const logout = async (): Promise<ApiResponse<any>> => {
  return post<ApiResponse<any>>('/admin/web/driver/auth/logout');
};

// 获取用户信息接口
export const getUserInfo = async (): Promise<ApiResponse<any>> => {
  return get<ApiResponse<any>>('/admin/web/driver/auth/info');
};

export default {
  apiClient,
  request,
  get,
  post,
  put,
  delete: del,
  login,
  logout,
  getUserInfo,
};